diff --git a/system/codeigniter/Base4.php b/system/codeigniter/Base4.php
index b242c00..a95c281 100644
--- a/system/codeigniter/Base4.php
+++ b/system/codeigniter/Base4.php
@@ -1,69 +1,69 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.3
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * CI_BASE - For PHP 4
- *
- * This file is used only when CodeIgniter is being run under PHP 4.
- *
- * In order to allow CI to work under PHP 4 we had to make the Loader class
- * the parent of the Controller Base class.  It's the only way we can
- * enable functions like $this->load->library('email') to instantiate
- * classes that can then be used within controllers as $this->email->send()
- *
- * PHP 4 also has trouble referencing the CI super object within application
- * constructors since objects do not exist until the class is fully
- * instantiated.  Basically PHP 4 sucks...
- *
- * Since PHP 5 doesn't suffer from this problem so we load one of
- * two files based on the version of PHP being run.
- *
- * @package		CodeIgniter
- * @subpackage	codeigniter
- * @category	front-controller
- * @author		ExpressionEngine Dev Team
- * @link		http://codeigniter.com/user_guide/
- */
- class CI_Base extends CI_Loader {
-
-	function CI_Base()
-	{
-		// This allows syntax like $this->load->foo() to work
-		parent::CI_Loader();
-		$this->load =& $this;
-		
-		// This allows resources used within controller constructors to work
-		global $OBJ;
-		$OBJ = $this->load; // Do NOT use a reference.
-	}
-}
-
-function &get_instance()
-{
-	global $CI, $OBJ;
-	
-	if (is_object($CI))
-	{
-		return $CI;
-	}
-	
-	return $OBJ->load;
-}
-
-
-/* End of file Base4.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.3
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 4
+ *
+ * This file is used only when CodeIgniter is being run under PHP 4.
+ *
+ * In order to allow CI to work under PHP 4 we had to make the Loader class
+ * the parent of the Controller Base class.  It's the only way we can
+ * enable functions like $this->load->library('email') to instantiate
+ * classes that can then be used within controllers as $this->email->send()
+ *
+ * PHP 4 also has trouble referencing the CI super object within application
+ * constructors since objects do not exist until the class is fully
+ * instantiated.  Basically PHP 4 sucks...
+ *
+ * Since PHP 5 doesn't suffer from this problem so we load one of
+ * two files based on the version of PHP being run.
+ *
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	front-controller
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/
+ */
+ class CI_Base extends CI_Loader {
+
+	function CI_Base()
+	{
+		// This allows syntax like $this->load->foo() to work
+		parent::CI_Loader();
+		$this->load =& $this;
+		
+		// This allows resources used within controller constructors to work
+		global $OBJ;
+		$OBJ = $this->load; // Do NOT use a reference.
+	}
+}
+
+function &get_instance()
+{
+	global $CI, $OBJ;
+	
+	if (is_object($CI))
+	{
+		return $CI;
+	}
+	
+	return $OBJ->load;
+}
+
+
+/* End of file Base4.php */
 /* Location: ./system/codeigniter/Base4.php */
\ No newline at end of file
diff --git a/system/codeigniter/Base5.php b/system/codeigniter/Base5.php
index 8dd3ad0..aa90355 100644
--- a/system/codeigniter/Base5.php
+++ b/system/codeigniter/Base5.php
@@ -1,56 +1,56 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.3
- * @filesource
- */
-
-
-// ------------------------------------------------------------------------
-
-/**
- * CI_BASE - For PHP 5
- *
- * This file contains some code used only when CodeIgniter is being
- * run under PHP 5.  It allows us to manage the CI super object more
- * gracefully than what is possible with PHP 4.
- *
- * @package		CodeIgniter
- * @subpackage	codeigniter
- * @category	front-controller
- * @author		ExpressionEngine Dev Team
- * @link		http://codeigniter.com/user_guide/
- */
-
-class CI_Base {
-
-	private static $instance;
-
-	public function CI_Base()
-	{
-		self::$instance =& $this;
-	}
-
-	public static function &get_instance()
-	{
-		return self::$instance;
-	}
-}
-
-function &get_instance()
-{
-	return CI_Base::get_instance();
-}
-
-
-
-/* End of file Base5.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.3
+ * @filesource
+ */
+
+
+// ------------------------------------------------------------------------
+
+/**
+ * CI_BASE - For PHP 5
+ *
+ * This file contains some code used only when CodeIgniter is being
+ * run under PHP 5.  It allows us to manage the CI super object more
+ * gracefully than what is possible with PHP 4.
+ *
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	front-controller
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/
+ */
+
+class CI_Base {
+
+	private static $instance;
+
+	public function CI_Base()
+	{
+		self::$instance =& $this;
+	}
+
+	public static function &get_instance()
+	{
+		return self::$instance;
+	}
+}
+
+function &get_instance()
+{
+	return CI_Base::get_instance();
+}
+
+
+
+/* End of file Base5.php */
 /* Location: ./system/codeigniter/Base5.php */
\ No newline at end of file
diff --git a/system/codeigniter/CodeIgniter.php b/system/codeigniter/CodeIgniter.php
index 27094d2..fa4bf77 100644
--- a/system/codeigniter/CodeIgniter.php
+++ b/system/codeigniter/CodeIgniter.php
@@ -1,276 +1,276 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.0
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * System Front Controller
- *
- * Loads the base classes and executes the request.
- *
- * @package		CodeIgniter
- * @subpackage	codeigniter
- * @category	Front-controller
- * @author		ExpressionEngine Dev Team
- * @link		http://codeigniter.com/user_guide/
- */
-
-// CI Version
-define('CI_VERSION',	'1.7.0');
-
-/*
- * ------------------------------------------------------
- *  Load the global functions
- * ------------------------------------------------------
- */
-require(BASEPATH.'codeigniter/Common'.EXT);
-
-/*
- * ------------------------------------------------------
- *  Load the compatibility override functions
- * ------------------------------------------------------
- */
-require(BASEPATH.'codeigniter/Compat'.EXT);
-
-/*
- * ------------------------------------------------------
- *  Load the framework constants
- * ------------------------------------------------------
- */
-require(APPPATH.'config/constants'.EXT);
-
-/*
- * ------------------------------------------------------
- *  Define a custom error handler so we can log PHP errors
- * ------------------------------------------------------
- */
-set_error_handler('_exception_handler');
-set_magic_quotes_runtime(0); // Kill magic quotes
-
-/*
- * ------------------------------------------------------
- *  Start the timer... tick tock tick tock...
- * ------------------------------------------------------
- */
-
-$BM =& load_class('Benchmark');
-$BM->mark('total_execution_time_start');
-$BM->mark('loading_time_base_classes_start');
-
-/*
- * ------------------------------------------------------
- *  Instantiate the hooks class
- * ------------------------------------------------------
- */
-
-$EXT =& load_class('Hooks');
-
-/*
- * ------------------------------------------------------
- *  Is there a "pre_system" hook?
- * ------------------------------------------------------
- */
-$EXT->_call_hook('pre_system');
-
-/*
- * ------------------------------------------------------
- *  Instantiate the base classes
- * ------------------------------------------------------
- */
-
-$CFG =& load_class('Config');
-$URI =& load_class('URI');
-$RTR =& load_class('Router');
-$OUT =& load_class('Output');
-
-/*
- * ------------------------------------------------------
- *	Is there a valid cache file?  If so, we're done...
- * ------------------------------------------------------
- */
-
-if ($EXT->_call_hook('cache_override') === FALSE)
-{
-	if ($OUT->_display_cache($CFG, $URI) == TRUE)
-	{
-		exit;
-	}
-}
-
-/*
- * ------------------------------------------------------
- *  Load the remaining base classes
- * ------------------------------------------------------
- */
-
-$IN		=& load_class('Input');
-$LANG	=& load_class('Language');
-
-/*
- * ------------------------------------------------------
- *  Load the app controller and local controller
- * ------------------------------------------------------
- *
- *  Note: Due to the poor object handling in PHP 4 we'll
- *  conditionally load different versions of the base
- *  class.  Retaining PHP 4 compatibility requires a bit of a hack.
- *
- *  Note: The Loader class needs to be included first
- *
- */
-if (floor(phpversion()) < 5)
-{
-	load_class('Loader', FALSE);
-	require(BASEPATH.'codeigniter/Base4'.EXT);
-}
-else
-{
-	require(BASEPATH.'codeigniter/Base5'.EXT);
-}
-
-// Load the base controller class
-load_class('Controller', FALSE);
-
-// Load the local application controller
-// Note: The Router class automatically validates the controller path.  If this include fails it 
-// means that the default controller in the Routes.php file is not resolving to something valid.
-if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT))
-{
-	show_error('Unable to load your default controller.  Please make sure the controller specified in your Routes.php file is valid.');
-}
-
-include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);
-
-// Set a mark point for benchmarking
-$BM->mark('loading_time_base_classes_end');
-
-
-/*
- * ------------------------------------------------------
- *  Security check
- * ------------------------------------------------------
- *
- *  None of the functions in the app controller or the
- *  loader class can be called via the URI, nor can
- *  controller functions that begin with an underscore
- */
-$class  = $RTR->fetch_class();
-$method = $RTR->fetch_method();
-
-if ( ! class_exists($class)
-	OR $method == 'controller'
-	OR strncmp($method, '_', 1) == 0
-	OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
-	)
-{
-	show_404("{$class}/{$method}");
-}
-
-/*
- * ------------------------------------------------------
- *  Is there a "pre_controller" hook?
- * ------------------------------------------------------
- */
-$EXT->_call_hook('pre_controller');
-
-/*
- * ------------------------------------------------------
- *  Instantiate the controller and call requested method
- * ------------------------------------------------------
- */
-
-// Mark a start point so we can benchmark the controller
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
-
-$CI = new $class();
-
-// Is this a scaffolding request?
-if ($RTR->scaffolding_request === TRUE)
-{
-	if ($EXT->_call_hook('scaffolding_override') === FALSE)
-	{
-		$CI->_ci_scaffolding();
-	}
-}
-else
-{
-	/*
-	 * ------------------------------------------------------
-	 *  Is there a "post_controller_constructor" hook?
-	 * ------------------------------------------------------
-	 */
-	$EXT->_call_hook('post_controller_constructor');
-	
-	// Is there a "remap" function?
-	if (method_exists($CI, '_remap'))
-	{
-		$CI->_remap($method);
-	}
-	else
-	{
-		// is_callable() returns TRUE on some versions of PHP 5 for private and protected
-		// methods, so we'll use this workaround for consistent behavior
-		if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
-		{
-			show_404("{$class}/{$method}");
-		}
-
-		// Call the requested method.
-		// Any URI segments present (besides the class/function) will be passed to the method for convenience
-		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
-	}
-}
-
-// Mark a benchmark end point
-$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
-
-/*
- * ------------------------------------------------------
- *  Is there a "post_controller" hook?
- * ------------------------------------------------------
- */
-$EXT->_call_hook('post_controller');
-
-/*
- * ------------------------------------------------------
- *  Send the final rendered output to the browser
- * ------------------------------------------------------
- */
-
-if ($EXT->_call_hook('display_override') === FALSE)
-{
-	$OUT->_display();
-}
-
-/*
- * ------------------------------------------------------
- *  Is there a "post_system" hook?
- * ------------------------------------------------------
- */
-$EXT->_call_hook('post_system');
-
-/*
- * ------------------------------------------------------
- *  Close the DB connection if one exists
- * ------------------------------------------------------
- */
-if (class_exists('CI_DB') AND isset($CI->db))
-{
-	$CI->db->close();
-}
-
-
-/* End of file CodeIgniter.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * System Front Controller
+ *
+ * Loads the base classes and executes the request.
+ *
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	Front-controller
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/
+ */
+
+// CI Version
+define('CI_VERSION',	'1.7.0');
+
+/*
+ * ------------------------------------------------------
+ *  Load the global functions
+ * ------------------------------------------------------
+ */
+require(BASEPATH.'codeigniter/Common'.EXT);
+
+/*
+ * ------------------------------------------------------
+ *  Load the compatibility override functions
+ * ------------------------------------------------------
+ */
+require(BASEPATH.'codeigniter/Compat'.EXT);
+
+/*
+ * ------------------------------------------------------
+ *  Load the framework constants
+ * ------------------------------------------------------
+ */
+require(APPPATH.'config/constants'.EXT);
+
+/*
+ * ------------------------------------------------------
+ *  Define a custom error handler so we can log PHP errors
+ * ------------------------------------------------------
+ */
+set_error_handler('_exception_handler');
+set_magic_quotes_runtime(0); // Kill magic quotes
+
+/*
+ * ------------------------------------------------------
+ *  Start the timer... tick tock tick tock...
+ * ------------------------------------------------------
+ */
+
+$BM =& load_class('Benchmark');
+$BM->mark('total_execution_time_start');
+$BM->mark('loading_time_base_classes_start');
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the hooks class
+ * ------------------------------------------------------
+ */
+
+$EXT =& load_class('Hooks');
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "pre_system" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('pre_system');
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the base classes
+ * ------------------------------------------------------
+ */
+
+$CFG =& load_class('Config');
+$URI =& load_class('URI');
+$RTR =& load_class('Router');
+$OUT =& load_class('Output');
+
+/*
+ * ------------------------------------------------------
+ *	Is there a valid cache file?  If so, we're done...
+ * ------------------------------------------------------
+ */
+
+if ($EXT->_call_hook('cache_override') === FALSE)
+{
+	if ($OUT->_display_cache($CFG, $URI) == TRUE)
+	{
+		exit;
+	}
+}
+
+/*
+ * ------------------------------------------------------
+ *  Load the remaining base classes
+ * ------------------------------------------------------
+ */
+
+$IN		=& load_class('Input');
+$LANG	=& load_class('Language');
+
+/*
+ * ------------------------------------------------------
+ *  Load the app controller and local controller
+ * ------------------------------------------------------
+ *
+ *  Note: Due to the poor object handling in PHP 4 we'll
+ *  conditionally load different versions of the base
+ *  class.  Retaining PHP 4 compatibility requires a bit of a hack.
+ *
+ *  Note: The Loader class needs to be included first
+ *
+ */
+if (floor(phpversion()) < 5)
+{
+	load_class('Loader', FALSE);
+	require(BASEPATH.'codeigniter/Base4'.EXT);
+}
+else
+{
+	require(BASEPATH.'codeigniter/Base5'.EXT);
+}
+
+// Load the base controller class
+load_class('Controller', FALSE);
+
+// Load the local application controller
+// Note: The Router class automatically validates the controller path.  If this include fails it 
+// means that the default controller in the Routes.php file is not resolving to something valid.
+if ( ! file_exists(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT))
+{
+	show_error('Unable to load your default controller.  Please make sure the controller specified in your Routes.php file is valid.');
+}
+
+include(APPPATH.'controllers/'.$RTR->fetch_directory().$RTR->fetch_class().EXT);
+
+// Set a mark point for benchmarking
+$BM->mark('loading_time_base_classes_end');
+
+
+/*
+ * ------------------------------------------------------
+ *  Security check
+ * ------------------------------------------------------
+ *
+ *  None of the functions in the app controller or the
+ *  loader class can be called via the URI, nor can
+ *  controller functions that begin with an underscore
+ */
+$class  = $RTR->fetch_class();
+$method = $RTR->fetch_method();
+
+if ( ! class_exists($class)
+	OR $method == 'controller'
+	OR strncmp($method, '_', 1) == 0
+	OR in_array(strtolower($method), array_map('strtolower', get_class_methods('Controller')))
+	)
+{
+	show_404("{$class}/{$method}");
+}
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "pre_controller" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('pre_controller');
+
+/*
+ * ------------------------------------------------------
+ *  Instantiate the controller and call requested method
+ * ------------------------------------------------------
+ */
+
+// Mark a start point so we can benchmark the controller
+$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_start');
+
+$CI = new $class();
+
+// Is this a scaffolding request?
+if ($RTR->scaffolding_request === TRUE)
+{
+	if ($EXT->_call_hook('scaffolding_override') === FALSE)
+	{
+		$CI->_ci_scaffolding();
+	}
+}
+else
+{
+	/*
+	 * ------------------------------------------------------
+	 *  Is there a "post_controller_constructor" hook?
+	 * ------------------------------------------------------
+	 */
+	$EXT->_call_hook('post_controller_constructor');
+	
+	// Is there a "remap" function?
+	if (method_exists($CI, '_remap'))
+	{
+		$CI->_remap($method);
+	}
+	else
+	{
+		// is_callable() returns TRUE on some versions of PHP 5 for private and protected
+		// methods, so we'll use this workaround for consistent behavior
+		if ( ! in_array(strtolower($method), array_map('strtolower', get_class_methods($CI))))
+		{
+			show_404("{$class}/{$method}");
+		}
+
+		// Call the requested method.
+		// Any URI segments present (besides the class/function) will be passed to the method for convenience
+		call_user_func_array(array(&$CI, $method), array_slice($URI->rsegments, 2));
+	}
+}
+
+// Mark a benchmark end point
+$BM->mark('controller_execution_time_( '.$class.' / '.$method.' )_end');
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "post_controller" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('post_controller');
+
+/*
+ * ------------------------------------------------------
+ *  Send the final rendered output to the browser
+ * ------------------------------------------------------
+ */
+
+if ($EXT->_call_hook('display_override') === FALSE)
+{
+	$OUT->_display();
+}
+
+/*
+ * ------------------------------------------------------
+ *  Is there a "post_system" hook?
+ * ------------------------------------------------------
+ */
+$EXT->_call_hook('post_system');
+
+/*
+ * ------------------------------------------------------
+ *  Close the DB connection if one exists
+ * ------------------------------------------------------
+ */
+if (class_exists('CI_DB') AND isset($CI->db))
+{
+	$CI->db->close();
+}
+
+
+/* End of file CodeIgniter.php */
 /* Location: ./system/codeigniter/CodeIgniter.php */
\ No newline at end of file
diff --git a/system/codeigniter/Common.php b/system/codeigniter/Common.php
index 9212f07..3c75f5e 100644
--- a/system/codeigniter/Common.php
+++ b/system/codeigniter/Common.php
@@ -1,307 +1,307 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.0
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * Common Functions
- *
- * Loads the base classes and executes the request.
- *
- * @package		CodeIgniter
- * @subpackage	codeigniter
- * @category	Common Functions
- * @author		ExpressionEngine Dev Team
- * @link		http://codeigniter.com/user_guide/
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * Tests for file writability
- *
- * is_writable() returns TRUE on Windows servers when you really can't write to 
- * the file, based on the read-only attribute.  is_writable() is also unreliable
- * on Unix servers if safe_mode is on. 
- *
- * @access	private
- * @return	void
- */
-function is_really_writable($file)
-{	
-	// If we're on a Unix server with safe_mode off we call is_writable
-	if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
-	{
-		return is_writable($file);
-	}
-
-	// For windows servers and safe_mode "on" installations we'll actually
-	// write a file then read it.  Bah...
-	if (is_dir($file))
-	{
-		$file = rtrim($file, '/').'/'.md5(rand(1,100));
-
-		if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
-		{
-			return FALSE;
-		}
-
-		fclose($fp);
-		@chmod($file, DIR_WRITE_MODE);
-		@unlink($file);
-		return TRUE;
-	}
-	elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
-	{
-		return FALSE;
-	}
-
-	fclose($fp);
-	return TRUE;
-}
-
-// ------------------------------------------------------------------------
-
-/**
-* Class registry
-*
-* This function acts as a singleton.  If the requested class does not
-* exist it is instantiated and set to a static variable.  If it has
-* previously been instantiated the variable is returned.
-*
-* @access	public
-* @param	string	the class name being requested
-* @param	bool	optional flag that lets classes get loaded but not instantiated
-* @return	object
-*/
-function &load_class($class, $instantiate = TRUE)
-{
-	static $objects = array();
-
-	// Does the class exist?  If so, we're done...
-	if (isset($objects[$class]))
-	{
-		return $objects[$class];
-	}
-
-	// If the requested class does not exist in the application/libraries
-	// folder we'll load the native class from the system/libraries folder.	
-	if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))
-	{
-		require(BASEPATH.'libraries/'.$class.EXT);
-		require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
-		$is_subclass = TRUE;
-	}
-	else
-	{
-		if (file_exists(APPPATH.'libraries/'.$class.EXT))
-		{
-			require(APPPATH.'libraries/'.$class.EXT);
-			$is_subclass = FALSE;
-		}
-		else
-		{
-			require(BASEPATH.'libraries/'.$class.EXT);
-			$is_subclass = FALSE;
-		}
-	}
-
-	if ($instantiate == FALSE)
-	{
-		$objects[$class] = TRUE;
-		return $objects[$class];
-	}
-
-	if ($is_subclass == TRUE)
-	{
-		$name = config_item('subclass_prefix').$class;
-		$objects[$class] =& new $name();
-		return $objects[$class];
-	}
-
-	$name = ($class != 'Controller') ? 'CI_'.$class : $class;
-	
-	$objects[$class] =& new $name();
-	return $objects[$class];
-}
-
-/**
-* Loads the main config.php file
-*
-* @access	private
-* @return	array
-*/
-function &get_config()
-{
-	static $main_conf;
-
-	if ( ! isset($main_conf))
-	{
-		if ( ! file_exists(APPPATH.'config/config'.EXT))
-		{
-			exit('The configuration file config'.EXT.' does not exist.');
-		}
-
-		require(APPPATH.'config/config'.EXT);
-
-		if ( ! isset($config) OR ! is_array($config))
-		{
-			exit('Your config file does not appear to be formatted correctly.');
-		}
-
-		$main_conf[0] =& $config;
-	}
-	return $main_conf[0];
-}
-
-/**
-* Gets a config item
-*
-* @access	public
-* @return	mixed
-*/
-function config_item($item)
-{
-	static $config_item = array();
-
-	if ( ! isset($config_item[$item]))
-	{
-		$config =& get_config();
-
-		if ( ! isset($config[$item]))
-		{
-			return FALSE;
-		}
-		$config_item[$item] = $config[$item];
-	}
-
-	return $config_item[$item];
-}
-
-
-/**
-* Error Handler
-*
-* This function lets us invoke the exception class and
-* display errors using the standard error template located
-* in application/errors/errors.php
-* This function will send the error page directly to the
-* browser and exit.
-*
-* @access	public
-* @return	void
-*/
-function show_error($message)
-{
-	$error =& load_class('Exceptions');
-	echo $error->show_error('An Error Was Encountered', $message);
-	exit;
-}
-
-
-/**
-* 404 Page Handler
-*
-* This function is similar to the show_error() function above
-* However, instead of the standard error template it displays
-* 404 errors.
-*
-* @access	public
-* @return	void
-*/
-function show_404($page = '')
-{
-	$error =& load_class('Exceptions');
-	$error->show_404($page);
-	exit;
-}
-
-
-/**
-* Error Logging Interface
-*
-* We use this as a simple mechanism to access the logging
-* class and send messages to be logged.
-*
-* @access	public
-* @return	void
-*/
-function log_message($level = 'error', $message, $php_error = FALSE)
-{
-	static $LOG;
-	
-	$config =& get_config();
-	if ($config['log_threshold'] == 0)
-	{
-		return;
-	}
-
-	$LOG =& load_class('Log');
-	$LOG->write_log($level, $message, $php_error);
-}
-
-/**
-* Exception Handler
-*
-* This is the custom exception handler that is declaired at the top
-* of Codeigniter.php.  The main reason we use this is permit
-* PHP errors to be logged in our own log files since we may
-* not have access to server logs. Since this function
-* effectively intercepts PHP errors, however, we also need
-* to display errors based on the current error_reporting level.
-* We do that with the use of a PHP error template.
-*
-* @access	private
-* @return	void
-*/
-function _exception_handler($severity, $message, $filepath, $line)
-{	
-	 // We don't bother with "strict" notices since they will fill up
-	 // the log file with information that isn't normally very
-	 // helpful.  For example, if you are running PHP 5 and you
-	 // use version 4 style class functions (without prefixes
-	 // like "public", "private", etc.) you'll get notices telling
-	 // you that these have been deprecated.
-	
-	if ($severity == E_STRICT)
-	{
-		return;
-	}
-
-	$error =& load_class('Exceptions');
-
-	// Should we display the error?
-	// We'll get the current error_reporting level and add its bits
-	// with the severity bits to find out.
-	
-	if (($severity & error_reporting()) == $severity)
-	{
-		$error->show_php_error($severity, $message, $filepath, $line);
-	}
-	
-	// Should we log the error?  No?  We're done...
-	$config =& get_config();
-	if ($config['log_threshold'] == 0)
-	{
-		return;
-	}
-
-	$error->log_exception($severity, $message, $filepath, $line);
-}
-
-
-
-/* End of file Common.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Common Functions
+ *
+ * Loads the base classes and executes the request.
+ *
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	Common Functions
+ * @author		ExpressionEngine Dev Team
+ * @link		http://codeigniter.com/user_guide/
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Tests for file writability
+ *
+ * is_writable() returns TRUE on Windows servers when you really can't write to 
+ * the file, based on the read-only attribute.  is_writable() is also unreliable
+ * on Unix servers if safe_mode is on. 
+ *
+ * @access	private
+ * @return	void
+ */
+function is_really_writable($file)
+{	
+	// If we're on a Unix server with safe_mode off we call is_writable
+	if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
+	{
+		return is_writable($file);
+	}
+
+	// For windows servers and safe_mode "on" installations we'll actually
+	// write a file then read it.  Bah...
+	if (is_dir($file))
+	{
+		$file = rtrim($file, '/').'/'.md5(rand(1,100));
+
+		if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
+		{
+			return FALSE;
+		}
+
+		fclose($fp);
+		@chmod($file, DIR_WRITE_MODE);
+		@unlink($file);
+		return TRUE;
+	}
+	elseif (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
+	{
+		return FALSE;
+	}
+
+	fclose($fp);
+	return TRUE;
+}
+
+// ------------------------------------------------------------------------
+
+/**
+* Class registry
+*
+* This function acts as a singleton.  If the requested class does not
+* exist it is instantiated and set to a static variable.  If it has
+* previously been instantiated the variable is returned.
+*
+* @access	public
+* @param	string	the class name being requested
+* @param	bool	optional flag that lets classes get loaded but not instantiated
+* @return	object
+*/
+function &load_class($class, $instantiate = TRUE)
+{
+	static $objects = array();
+
+	// Does the class exist?  If so, we're done...
+	if (isset($objects[$class]))
+	{
+		return $objects[$class];
+	}
+
+	// If the requested class does not exist in the application/libraries
+	// folder we'll load the native class from the system/libraries folder.	
+	if (file_exists(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT))
+	{
+		require(BASEPATH.'libraries/'.$class.EXT);
+		require(APPPATH.'libraries/'.config_item('subclass_prefix').$class.EXT);
+		$is_subclass = TRUE;
+	}
+	else
+	{
+		if (file_exists(APPPATH.'libraries/'.$class.EXT))
+		{
+			require(APPPATH.'libraries/'.$class.EXT);
+			$is_subclass = FALSE;
+		}
+		else
+		{
+			require(BASEPATH.'libraries/'.$class.EXT);
+			$is_subclass = FALSE;
+		}
+	}
+
+	if ($instantiate == FALSE)
+	{
+		$objects[$class] = TRUE;
+		return $objects[$class];
+	}
+
+	if ($is_subclass == TRUE)
+	{
+		$name = config_item('subclass_prefix').$class;
+		$objects[$class] =& new $name();
+		return $objects[$class];
+	}
+
+	$name = ($class != 'Controller') ? 'CI_'.$class : $class;
+	
+	$objects[$class] =& new $name();
+	return $objects[$class];
+}
+
+/**
+* Loads the main config.php file
+*
+* @access	private
+* @return	array
+*/
+function &get_config()
+{
+	static $main_conf;
+
+	if ( ! isset($main_conf))
+	{
+		if ( ! file_exists(APPPATH.'config/config'.EXT))
+		{
+			exit('The configuration file config'.EXT.' does not exist.');
+		}
+
+		require(APPPATH.'config/config'.EXT);
+
+		if ( ! isset($config) OR ! is_array($config))
+		{
+			exit('Your config file does not appear to be formatted correctly.');
+		}
+
+		$main_conf[0] =& $config;
+	}
+	return $main_conf[0];
+}
+
+/**
+* Gets a config item
+*
+* @access	public
+* @return	mixed
+*/
+function config_item($item)
+{
+	static $config_item = array();
+
+	if ( ! isset($config_item[$item]))
+	{
+		$config =& get_config();
+
+		if ( ! isset($config[$item]))
+		{
+			return FALSE;
+		}
+		$config_item[$item] = $config[$item];
+	}
+
+	return $config_item[$item];
+}
+
+
+/**
+* Error Handler
+*
+* This function lets us invoke the exception class and
+* display errors using the standard error template located
+* in application/errors/errors.php
+* This function will send the error page directly to the
+* browser and exit.
+*
+* @access	public
+* @return	void
+*/
+function show_error($message)
+{
+	$error =& load_class('Exceptions');
+	echo $error->show_error('An Error Was Encountered', $message);
+	exit;
+}
+
+
+/**
+* 404 Page Handler
+*
+* This function is similar to the show_error() function above
+* However, instead of the standard error template it displays
+* 404 errors.
+*
+* @access	public
+* @return	void
+*/
+function show_404($page = '')
+{
+	$error =& load_class('Exceptions');
+	$error->show_404($page);
+	exit;
+}
+
+
+/**
+* Error Logging Interface
+*
+* We use this as a simple mechanism to access the logging
+* class and send messages to be logged.
+*
+* @access	public
+* @return	void
+*/
+function log_message($level = 'error', $message, $php_error = FALSE)
+{
+	static $LOG;
+	
+	$config =& get_config();
+	if ($config['log_threshold'] == 0)
+	{
+		return;
+	}
+
+	$LOG =& load_class('Log');
+	$LOG->write_log($level, $message, $php_error);
+}
+
+/**
+* Exception Handler
+*
+* This is the custom exception handler that is declaired at the top
+* of Codeigniter.php.  The main reason we use this is permit
+* PHP errors to be logged in our own log files since we may
+* not have access to server logs. Since this function
+* effectively intercepts PHP errors, however, we also need
+* to display errors based on the current error_reporting level.
+* We do that with the use of a PHP error template.
+*
+* @access	private
+* @return	void
+*/
+function _exception_handler($severity, $message, $filepath, $line)
+{	
+	 // We don't bother with "strict" notices since they will fill up
+	 // the log file with information that isn't normally very
+	 // helpful.  For example, if you are running PHP 5 and you
+	 // use version 4 style class functions (without prefixes
+	 // like "public", "private", etc.) you'll get notices telling
+	 // you that these have been deprecated.
+	
+	if ($severity == E_STRICT)
+	{
+		return;
+	}
+
+	$error =& load_class('Exceptions');
+
+	// Should we display the error?
+	// We'll get the current error_reporting level and add its bits
+	// with the severity bits to find out.
+	
+	if (($severity & error_reporting()) == $severity)
+	{
+		$error->show_php_error($severity, $message, $filepath, $line);
+	}
+	
+	// Should we log the error?  No?  We're done...
+	$config =& get_config();
+	if ($config['log_threshold'] == 0)
+	{
+		return;
+	}
+
+	$error->log_exception($severity, $message, $filepath, $line);
+}
+
+
+
+/* End of file Common.php */
 /* Location: ./system/codeigniter/Common.php */
\ No newline at end of file
diff --git a/system/codeigniter/Compat.php b/system/codeigniter/Compat.php
index 291f01d..6100956 100644
--- a/system/codeigniter/Compat.php
+++ b/system/codeigniter/Compat.php
@@ -1,93 +1,93 @@
-<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
-/**
- * CodeIgniter
- *
- * An open source application development framework for PHP 4.3.2 or newer
- *
- * @package		CodeIgniter
- * @author		ExpressionEngine Dev Team
- * @copyright	Copyright (c) 2008, EllisLab, Inc.
- * @license		http://codeigniter.com/user_guide/license.html
- * @link		http://codeigniter.com
- * @since		Version 1.0
- * @filesource
- */
-
-// ------------------------------------------------------------------------
-
-/**
- * Compatibility Functions
- *
- * Function overrides for older versions of PHP or PHP environments missing
- * certain extensions / libraries
- *
- * @package		CodeIgniter
- * @subpackage	codeigniter
- * @category	Compatibility Functions
- * @author		ExpressionEngine Development Team
- * @link		http://codeigniter.com/user_guide/
- */
-
-// ------------------------------------------------------------------------
-
-/*
- * PHP versions prior to 5.0 don't support the E_STRICT constant
- * so we need to explicitly define it otherwise the Exception class 
- * will generate errors when running under PHP 4
- *
- */
-if ( ! defined('E_STRICT'))
-{
-	define('E_STRICT', 2048);
-}
-
-/**
- * ctype_digit()
- *
- * Determines if a string is comprised only of digits
- * http://us.php.net/manual/en/function.ctype_digit.php
- *
- * @access	public
- * @param	string
- * @return	bool
- */
-if ( ! function_exists('ctype_digit'))
-{
-	function ctype_digit($str)
-	{
-		if ( ! is_string($str) OR $str == '')
-		{
-			return FALSE;
-		}
-		
-		return ! preg_match('/[^0-9]/', $str);
-	}	
-}
-
-// --------------------------------------------------------------------
-
-/**
- * ctype_alnum()
- *
- * Determines if a string is comprised of only alphanumeric characters
- * http://us.php.net/manual/en/function.ctype-alnum.php
- *
- * @access	public
- * @param	string
- * @return	bool
- */
-if ( ! function_exists('ctype_alnum'))
-{
-	function ctype_alnum($str)
-	{
-		if ( ! is_string($str) OR $str == '')
-		{
-			return FALSE;
-		}
-		
-		return ! preg_match('/[^0-9a-z]/i', $str);
-	}	
-}
-
-/* End of file Compat.php */
+<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
+/**
+ * CodeIgniter
+ *
+ * An open source application development framework for PHP 4.3.2 or newer
+ *
+ * @package		CodeIgniter
+ * @author		ExpressionEngine Dev Team
+ * @copyright	Copyright (c) 2008, EllisLab, Inc.
+ * @license		http://codeigniter.com/user_guide/license.html
+ * @link		http://codeigniter.com
+ * @since		Version 1.0
+ * @filesource
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * Compatibility Functions
+ *
+ * Function overrides for older versions of PHP or PHP environments missing
+ * certain extensions / libraries
+ *
+ * @package		CodeIgniter
+ * @subpackage	codeigniter
+ * @category	Compatibility Functions
+ * @author		ExpressionEngine Development Team
+ * @link		http://codeigniter.com/user_guide/
+ */
+
+// ------------------------------------------------------------------------
+
+/*
+ * PHP versions prior to 5.0 don't support the E_STRICT constant
+ * so we need to explicitly define it otherwise the Exception class 
+ * will generate errors when running under PHP 4
+ *
+ */
+if ( ! defined('E_STRICT'))
+{
+	define('E_STRICT', 2048);
+}
+
+/**
+ * ctype_digit()
+ *
+ * Determines if a string is comprised only of digits
+ * http://us.php.net/manual/en/function.ctype_digit.php
+ *
+ * @access	public
+ * @param	string
+ * @return	bool
+ */
+if ( ! function_exists('ctype_digit'))
+{
+	function ctype_digit($str)
+	{
+		if ( ! is_string($str) OR $str == '')
+		{
+			return FALSE;
+		}
+		
+		return ! preg_match('/[^0-9]/', $str);
+	}	
+}
+
+// --------------------------------------------------------------------
+
+/**
+ * ctype_alnum()
+ *
+ * Determines if a string is comprised of only alphanumeric characters
+ * http://us.php.net/manual/en/function.ctype-alnum.php
+ *
+ * @access	public
+ * @param	string
+ * @return	bool
+ */
+if ( ! function_exists('ctype_alnum'))
+{
+	function ctype_alnum($str)
+	{
+		if ( ! is_string($str) OR $str == '')
+		{
+			return FALSE;
+		}
+		
+		return ! preg_match('/[^0-9a-z]/i', $str);
+	}	
+}
+
+/* End of file Compat.php */
 /* Location: ./system/codeigniter/Compat.php */
\ No newline at end of file
diff --git a/system/codeigniter/index.html b/system/codeigniter/index.html
index 065d2da..c942a79 100644
--- a/system/codeigniter/index.html
+++ b/system/codeigniter/index.html
@@ -1,10 +1,10 @@
-<html>
-<head>
-	<title>403 Forbidden</title>
-</head>
-<body>
-
-<p>Directory access is forbidden.</p>
-
-</body>
+<html>
+<head>
+	<title>403 Forbidden</title>
+</head>
+<body>
+
+<p>Directory access is forbidden.</p>
+
+</body>
 </html>
\ No newline at end of file
